package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"regexp"
	"strings"
)

func testRegex() {
	resp, err := http.Get("http://www.baidu.com")
	if err != nil {
		fmt.Println("http get error:", err)
		return
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("http read error:", err)
		return
	}
	src := string(body)
	// 将HTML标签转小写
	re, _ := regexp.Compile("\\<[\\S\\s]+?\\>")
	src = re.ReplaceAllStringFunc(src, strings.ToLower)

	// 去除Style
	re, _ = regexp.Compile("\\<style[\\S\\s]+?\\</style\\>")
	src = re.ReplaceAllString(src, "")

	// 去除script
	re, _ = regexp.Compile("\\<script[\\S\\s]+?\\</script\\>")
	src = re.ReplaceAllString(src, "")

	// 去除所有尖括号内的HTML代码，并找成换行符
	re, _ = regexp.Compile("\\<[\\S\\s]+?\\>")
	src = re.ReplaceAllString(src, "\n")

	// 去除连续的换行符
	re, _ = regexp.Compile("\\s{2,}")
	src = re.ReplaceAllString(src, "\n")

	fmt.Println(strings.TrimSpace(src))
}

func testSubRegex() {
	a := "I am learning Go language"
	re, _ := regexp.Compile("[a-z]{2,4}")
	// 查找符合正则第一个
	one := re.Find([]byte(a))
	fmt.Println("Find:", string(one))

	// 查找符合的所有slice，n小于0表示全部符合字符串，否则返回指定长度
	all := re.FindAll([]byte(a), -1)
	var allStr string
	for i := 0; i < len(all); i++ {
		allStr += string(all[i])
		if i < len(all)-1 {
			allStr += ","
		}
	}
	fmt.Println("FindAll:", allStr)

	// 查找符合条件index位置，开始位置和结束位置
	index := re.FindIndex([]byte(a))
	fmt.Println("FindIndex:", index)

	// 查找符合条件所有index位置
	allIndex := re.FindAllIndex([]byte(a), -1)
	fmt.Println("FindAllIndex:", allIndex)

	re2, _ := regexp.Compile("am(.*)lang(.*)")
	// 查找subMatch返回数组，第一个元素是匹配全部元素，第二个元素是第一个()分组里面的，第三个是第二个()分组里面的
	// " learning Go "
	// "uage"
	submatch := re2.FindSubmatch([]byte(a))
	fmt.Println("FindSubmatch:", submatch)
	for _, v := range submatch {
		fmt.Println(string(v))
	}

	submatchIndex := re2.FindSubmatchIndex([]byte(a))
	fmt.Println("FindSubmatchIndex:", submatchIndex)

	// FindAllSubmatch
	submatchall := re2.FindAllSubmatchIndex([]byte(a), -1)
	fmt.Println("FindAllSubmatchIndex:", submatchall)

	submatchAllIndex := re2.FindAllSubmatchIndex([]byte(a), -1)
	fmt.Println("FindAllSubmatchIndex:", submatchAllIndex)
}

func testExpand() {
	src := []byte(`
		call hello alice
		hello bob
		call hello eve
	`)
	pat := regexp.MustCompile(`(?m)(call)\s+(?P<cmd>\w+)\s+(?P<arg>.+)\s*$`)
	res := []byte{}
	for _, s := range pat.FindAllSubmatchIndex(src, -1) {
		res = pat.Expand(res, []byte("$cmd('$arg')\n"), src, s) // 按分组匹配结果重组成模板指定内容
	}
	fmt.Println(string(res))
}

func main() {
	testRegex()
	testSubRegex()
	testExpand()
}
